package com.match.common;

import com.match.controller.PushDepthTask;
import com.match.plugin.disruptor.DisruptorPlugin;
import com.match.plugin.hazelcast.HazelcastPlugin;
import com.match.plugin.kafka.KafkaPlugin;
import com.match.plugin.scheduler.SchedulerPlugin;
import com.match.plugin.threadpool.ThreadPoolPlugin;
import com.match.route.AdminRoute;
import com.match.route.FrontRoute;
import com.hazelcast.jet.Jet;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.server.undertow.UndertowServer;
import com.jfinal.template.Engine;

/**
 * 
 * 
 * API 引导式配置
 */
public class JmatchConfig extends JFinalConfig {
	
	static Prop p;
	
	/**
	 * 启动入口，运行此 main 方法可以启动项目，此 main 方法可以放置在任意的 Class 类定义中，不一定要放于此
	 */
	public static void main(String[] args) {
		UndertowServer.start(JmatchConfig.class);
	}
	
	/**
	 * PropKit.useFirstFound(...) 使用参数中从左到右最先被找到的配置文件
	 * 从左到右依次去找配置，找到则立即加载并立即返回，后续配置将被忽略
	 */
	static void loadConfig() {
		if (p == null) {
			p = PropKit.useFirstFound("config-pro.properties", "config-dev.properties");
		}
	}
	
	/**
	 * 配置常量
	 */
	public void configConstant(Constants me) {
		loadConfig();
		me.setDevMode(p.getBoolean("devMode"));
		/**
		 * 支持 Controller、Interceptor、Validator 之中使用 @Inject 注入业务层，并且自动实现 AOP
		 * 注入动作支持任意深度并自动处理循环注入
		 */
		me.setInjectDependency(true);
		// 配置对超类中的属性进行注入
		me.setInjectSuperClass(true);
	}
	
	/**
	 * 配置路由
	 */
	public void configRoute(Routes me) {
		me.add(new AdminRoute()); // 后端路由
        me.add(new FrontRoute()); // 前端路由
	}
	
	public void configEngine(Engine me) {
		
	}
	
	/**
	 * 配置插件
	 */
	public void configPlugin(Plugins me) {
		
        //事件驱动插件
//        EventPlugin event = new EventPlugin();
//        // 设置为异步，默认同步，或者使用`threadPool(ExecutorService executorService)`自定义线程池。
//        event.async();
//        // 开启类扫描，默认为 false，用于不支持注解处理器的情况或者不实用 maven 等包管理的情况。
//        event.enableClassScan();
//        me.add(event);
        
        //配置Hazelcast插件
        Jet.shutdownAll();
        HazelcastPlugin hazelcast = new HazelcastPlugin();
        me.add(hazelcast);
        //Disruptor
        DisruptorPlugin disruptor = new DisruptorPlugin();
        me.add(disruptor);
        //kafka
		KafkaPlugin kafkaPlugin = new KafkaPlugin();
		me.add(kafkaPlugin); 
		
		ThreadPoolPlugin threadPoolPlugin = new ThreadPoolPlugin(0, 0, 0, 0);
		me.add(threadPoolPlugin); 
		
		
		SchedulerPlugin sp = new SchedulerPlugin();
        Runnable task = new PushDepthTask();
        sp.scheduleWithFixedDelay(task, 5, 5);
        me.add(sp);
	}
	
	public static DruidPlugin createDruidPlugin() {
		loadConfig();
		return new DruidPlugin(p.get("jdbcUrl"), p.get("user"), p.get("password").trim());
	}
	
	/**
	 * 配置全局拦截器
	 */
	public void configInterceptor(Interceptors me) {
		
	}
	
	/**
	 * 配置处理器
	 */
	public void configHandler(Handlers me) {
		
	}
	
	public void onStart() {
		
	}
	 
	// 系统关闭之前回调
	public void onStop() {
		
	}
	
	
	
}
